home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 7 / BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso / Files / Prog / N-P / OOP for C.cpt / OIC.ƒ / linkseq.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-12-09  |  1.8 KB  |  97 lines  |  [TEXT/KAHL]

  1. /*
  2.  *        Sequence abstract class for Linked objects
  3.  *
  4.  *            Copyright © John Wainwright 1988
  5.  *
  6.  *    Superclasses:
  7.  *
  8.  *    Purpose:
  9.  *        To provide a class which will wrap-up a linked object (one that
  10.  *        responds to head, tail, etc) and provide the general sequencing
  11.  *        operations over it.
  12.  *
  13.  *    methods:
  14.  *        start ls l        -    initialises a new sequence object
  15.  *        next ls         -    get next element in the linked object, or END.
  16.  *        moreInSeq ls    -    return true if the seq is not exhausted
  17.  *        restart ls        -    restarts the sequence
  18.  */
  19.  
  20. #include "oic.h"
  21. #include "generics.h"
  22.  
  23. class      Linkseq;
  24.  
  25. struct seq_i
  26. {
  27.     object    ls_source;        /* the original source object             */
  28.     object    ls_rest;        /* current tail of source                 */
  29. };
  30. typedef struct seq_i seq_i;
  31.  
  32. /* ------------------------- Instance methods ---------------------------- */
  33.  
  34. static object
  35. _start(self, seq, source)
  36.     object            self;
  37.     register seq_i    *seq;
  38.     register object    *source;
  39. {
  40.     seq->ls_source = seq->ls_rest = *source;
  41.     return self;
  42. }
  43.  
  44. static object
  45. _next(self, seq)
  46.     object            self;
  47.     register seq_i    *seq;
  48. {
  49.     register object    item;
  50.  
  51.     item = head(seq->ls_rest);
  52.     seq->ls_rest = tail(seq->ls_rest);
  53.     if (item == END)
  54.         dispose(self);
  55.     return item;
  56. }
  57.  
  58. static int
  59. _moreInSeq(self, seq)
  60.     object            self;
  61.     register seq_i    *seq;
  62. {
  63.     return ! (int)isEmpty(seq->ls_rest);
  64. }
  65.  
  66. static object
  67. _restart(self, seq)
  68.     object            self;
  69.     register seq_i    *seq;
  70. {
  71.     seq->ls_rest = seq->ls_source;
  72.     return self;
  73. }
  74.  
  75. static
  76. _dispose(self)
  77.     object self;
  78. {
  79.     free(self);
  80. }
  81.  
  82. /* ------------------- Init the Linkseq class ------------------------------- */
  83.  
  84. _InitLinkseq()
  85. {
  86.     Linkseq = NewClass(sizeof(seq_i), 0, "Linkseq", END);
  87.     AddMethods(Linkseq,
  88.         startGeneric,         _start,
  89.         nextGeneric,          _next,
  90.         moreInSeqGeneric,     _moreInSeq,
  91.         restartGeneric,       _restart,
  92.         disposeGeneric,       _dispose,
  93.         deepDisposeGeneric,   _dispose,
  94.         END);
  95. }
  96.  
  97.